package repositorio;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import dados.Amostra;
import dados.Central;
import dados.Especialista;
import dados.Posto;
import dados.Resultado;

public class RepositorioCentral extends SentencasBD{

	public RepositorioCentral(ConexaoBD conexao){
		super(conexao, 1, 1, 1, 2);
		
		this.cadastro[0] = "INSERT INTO tb_central (id, numero_licenca, nome, endereco, postos, " +
						   "resultados, especialistas) VALUES(?, ?, ?, ?, tp_nt_posto(), tp_nt_resultado(), ";
		this.remocao[0] = "DELETE FROM tb_central WHERE id = ?";
		this.atualizacao[0] = "UPDATE tb_central SET numero_licenca = ?, nome = ?, endereco = ?, ";
		this.consulta[0] = "SELECT * FROM tb_central WHERE id = ?";
		this.consulta[1] = "SELECT C.id, C.numero_licenca, C.nome, C.endereco FROM tb_central C";
	}
	
	public void inserir(Central central) throws SQLException{
		String esps = "tp_nt_especialista(";
		for(int i = 0; i < central.getEspecialistas().size(); i++){
			Especialista e = central.getEspecialistas().get(i);
			esps += "(SELECT REF(C) FROM tb_especialista C WHERE C.id = " + e.getId() + ")";
			if(i != central.getEspecialistas().size()-1)
				esps += ",";
		}
		esps += "))";
		Connection c = this.conexao.getConexao();		
		PreparedStatement ps = c.prepareStatement(this.cadastro[0] + esps);
		ps.setInt(1, central.getId());
		ps.setLong(2, central.getNumeroLicenca());
		ps.setString(3, central.getNome());
		ps.setString(4, central.getEndereco());
		
		ps.executeUpdate();
		ps.close();
		c.close();	
	}
	
	public void remover(int id) throws SQLException{
		Connection c = this.conexao.getConexao();
		PreparedStatement ps = c.prepareStatement(this.remocao[0]);
		ps.setInt(1, id);
		
		ps.executeUpdate();
		ps.close();
		c.close();		
	}
	
	public void editar(Central central) throws SQLException{
		String esps = "tp_nt_especialista(";
		for(int i = 0; i < central.getEspecialistas().size(); i++){
			Especialista e = central.getEspecialistas().get(i);
			esps += "(SELECT REF(C) FROM tb_especialista C WHERE C.id = " + e.getId() + ")";
			if(i != central.getEspecialistas().size()-1)
				esps += ",";
		}
		esps += ")";
		
		String postos = "tp_nt_posto(";
		for(int i = 0; i < central.getPostoColeta().size(); i++){
			Posto p = central.getPostoColeta().get(i);
			postos += "(SELECT REF(C) FROM tb_posto C WHERE C.id = " + p.getId() + ")";
			if(i != central.getPostoColeta().size()-1)
				postos += ",";
		}
		postos += ")";
		
		String resultados = "tp_nt_resultado(";
		for(int i = 0; i < central.getResultados().size(); i++){
			Resultado r = central.getResultados().get(i);
			resultados += "(SELECT REF(C) FROM tb_resultado C WHERE C.id = " + r.getId() + ")";
			if(i != central.getResultados().size()-1)
				resultados += ",";
		}
		resultados += ")";
		
		Connection c = this.conexao.getConexao();
		String sql = this.atualizacao[0] + "postos = " + postos + ", especialistas = " + esps + ", " +
					 "resultados = " + resultados + " WHERE id = ?";
		//System.out.println(sql);
		PreparedStatement ps = c.prepareStatement(sql);
		ps.setLong(1, central.getNumeroLicenca());
		ps.setString(2, central.getNome());
		ps.setString(3, central.getEndereco());
		ps.setInt(4, central.getId());
		
		ps.executeUpdate();
		ps.close();
		c.close();
	}
	
	private List<Posto> pegarPostos(int id) throws SQLException{
		String sql = "SELECT DEREF(ss.COLUMN_VALUE).id, DEREF(ss.COLUMN_VALUE).nome, " +
					 "DEREF(ss.COLUMN_VALUE).endereco FROM " +
					 "TABLE(SELECT C.postos FROM tb_central C WHERE C.id = ?) ss";
		PreparedStatement ps = conexao.getConexao().prepareStatement(sql);
		ps.setInt(1, id);
		ResultSet set = ps.executeQuery();
		Posto temp = null;
		List<Posto> postos = new ArrayList<Posto>();
		while(set.next()){
			temp = new Posto(set.getInt(1), set.getString(2), set.getString(3));
			postos.add(temp);
		}
		
		return postos;
	}
	
	private List<Resultado> pegarResultados(int id) throws SQLException{
		String sql = "SELECT DEREF(ss.COLUMN_VALUE).id, DEREF(ss.COLUMN_VALUE).obs, " +
		 			 "DEREF(ss.COLUMN_VALUE).data, DEREF(ss.COLUMN_VALUE).descricao FROM " +
		 			 "TABLE(SELECT C.resultados FROM tb_central C WHERE C.id = ?) ss";
		PreparedStatement ps = conexao.getConexao().prepareStatement(sql);
		ps.setInt(1, id);
		ResultSet set = ps.executeQuery();
		Resultado temp = null;
		List<Resultado> resultados = new ArrayList<Resultado>();
		while(set.next()){
			temp = new Resultado(set.getInt(1), set.getString(2), set.getDate(3), set.getString(4));
			resultados.add(temp);
		}

		return resultados;
	}
	
	private List<Especialista> pegarEspecialistas(int id) throws SQLException{
		String sql = "SELECT DEREF(ss.COLUMN_VALUE).id, DEREF(ss.COLUMN_VALUE).nome, " +
		 			 "DEREF(ss.COLUMN_VALUE).cpf, DEREF(ss.COLUMN_VALUE).rg FROM " +
		 			 "TABLE(SELECT C.especialistas FROM tb_central C WHERE C.id = ?) ss";
		PreparedStatement ps = conexao.getConexao().prepareStatement(sql);
		ps.setInt(1, id);
		ResultSet set = ps.executeQuery();
		Especialista temp = null;
		List<Especialista> especialistas = new ArrayList<Especialista>();
		while(set.next()){
			temp = new Especialista(set.getInt(1), set.getString(2), set.getLong(3), set.getLong(4));
			especialistas.add(temp);
		}
		
		return especialistas;
	}
	
	public Central buscar(int id) throws SQLException{
		PreparedStatement ps = conexao.getConexao().prepareStatement(consulta[0]);
		ps.setInt(1, id);
		ResultSet set = ps.executeQuery();
		Central temp = null;
		if(set.next()){
			temp = new Central(set.getInt(1), set.getLong(2), set.getString(3), set.getString(4));
			temp.setPostoColeta(this.pegarPostos(id));
			//System.out.println("- pegou os postos");
			temp.setEspecialistas(this.pegarEspecialistas(id));
			//System.out.println("- pegou os especialistas");
			temp.setResultados(this.pegarResultados(id));
			//System.out.println("- pegou os resultados");
		}
		
		return temp;
	}
	
	public Iterator<Central> iterator() throws SQLException{
		PreparedStatement ps = conexao.getConexao().prepareStatement(consulta[1]);
		ResultSet set = ps.executeQuery();
		List<Central> all = new ArrayList<Central>();
		while(set.next()){
			all.add(new Central(set.getInt(1), set.getLong(2), set.getString(3), set.getString(4)));
		}
		return all.iterator();
	}
	
	/*
	public static void main(String[] args) {
		ConexaoBD c;
		try {
			c = new ConexaoBD("oracle.jdbc.driver.OracleDriver",
					"jdbc:oracle:thin:@itapissuma.cin.ufpe.br:1521:dbdisc", 
					"g101if685_eq02", "equipe2gdi");
			System.out.println("passou daqui 1");
			RepositorioCentral r = new RepositorioCentral(c);
			List<Especialista> esps = new ArrayList<Especialista>();
			esps.add(new Especialista(10104));
			Central ce = new Central(888, 54987, "nomEsp1", "endEsp1", esps);
			r.inserir(ce);
			System.out.println("INSERIU");
			System.out.println("BUSCANDO");
			Central teste = r.buscar(888);
			System.out.println("- Especialistas da central buscada:");
			for(Especialista e : teste.getEspecialistas())
				System.out.println("  " + e.getId() + "-" + e.getNome());
			List<Resultado> results = new ArrayList<Resultado>();
			List<Posto> postos = new ArrayList<Posto>();
			postos.add(new Posto(1010, "n", "e"));
			results.add(new Resultado(4545));
			ce.setPostoColeta(postos);
			ce.setResultados(results);
			System.out.println("EDITANDO");
			r.editar(ce);
			teste = r.buscar(888);
			System.out.println("- Especialistas da central atualizada:");
			for(Especialista e : teste.getEspecialistas())
				System.out.println("  " + e.getId() + "-" + e.getNome());
			System.out.println("- Resultados da central atualizada:");
			for(Resultado e : teste.getResultados())
				System.out.println("  " + e.getId() + "-" + e.getObservacao());
			System.out.println("- Postos da central atualizada:");
			for(Posto e : teste.getPostoColeta())
				System.out.println("  " + e.getId() + "-" + e.getNome());
			
			Iterator<Central> it = r.iterator();
			while(it.hasNext()){
				System.out.println("  - id:" + it.next().getId());
			}
		} catch (ClassNotFoundException e) {
			System.out.println(">> erro1");
			e.printStackTrace();
		} catch (SQLException e) {
			System.out.println(">> erro2");
			e.printStackTrace();
		}
	}*/
}
